'use strict';

// 1. 导入模板引擎模块
const nunjucks = require('nunjucks');

// 2. 编写函数,包装模板引擎
function createEnv(path, opts) {
    // 需要模板引擎渲染的文件夹路径，默认views文件夹
    path = path || 'views'
    // 可选功能的开启或关闭，默认为空对象
    opts = opts || {}
    // 3. 可选功能
    let envOptions = {
        // 自动转义，输出是否需要自动转义（默认为true）
        autoescape: opts.autoescape === undefined ? true : opts.autoescape,
        // 抛出异常，当输出 null 或 undefined 抛出异常（默认为false）
        throwOnUndefined: opts.throwOnUndefined === undefined ? false : opts.throwOnUndefined,
        // 模板改变时，页面是否重新加载（默认为false）
        watch: opts.watch === undefined ? false : opts.watch,
        // 是否有缓存（默认为false）
        noCache: opts.noCache === undefined ? false : opts.noCache
    }
    // 4. 往模板引擎里配置
    let env = nunjucks.configure(path, envOptions);
    // 返回 env
    return env;
}

// 5. 此模块作为中间件暴露出去，中间件必须为一个函数
module.exports = async (ctx, next) => {
    // 为 ctx 绑定 render 方法，方法有两个参数，view 为视图，也就是需要渲染的模板，model 为模型，也就是所需的数据
    ctx.render = function (view, model) {
        // 调用createEnv()函数
        let env = createEnv('views', { watch: true, noCache: true });
        // 渲染网页
        ctx.response.body = env.render(view, model);
    }
    // 调用下一个异步函数
    await next();
}

